import cv2
import numpy as np

img = cv2.imread("img/hough.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# image	8 位、单通道二进制源图像。该函数可以修改图像.
# rho	累加器的距离分辨率（以像素为单位）。
# theta	累加器的角度分辨率（以弧度为单位）.
# threshold	累加器阈值参数。只有那些获得足够票数的行才会返回 ( > threshold).
# srn	对于多尺度 Hough 变换，它是距离分辨率 rho 的除数。粗略累加器距离分辨率为rho，精确累加器分辨率为rho/srn。如果 srn=0 且 stn=0，则使用经典的 Hough 变换。否则，这两个参数都应该为正。
# stn	对于多尺度 Hough 变换，它是距离分辨率 theta 的除数。
# min_theta	对于标准和多尺度 Hough 变换，检查线的最小角度。必须介于 0 和 max_theta 之间。
# max_theta	对于标准和多尺度 Hough 变换，角度的上限。必须介于 min_theta 和 CV_PI 之间。蓄能器中的实际最大角度可能略小于 max_theta，具体取决于参数 min_theta 和 theta。

lines = cv2.HoughLines(binary, 1, np.pi / 180, 180)

for line in lines:
    r, theta = line[0]
    x, y = r * np.cos(theta), r * np.sin(theta)
    x1 = int(x - np.sin(theta) * 1000)
    y1 = int(y + np.cos(theta) * 1000)
    x2 = int(x + np.sin(theta) * 1000)
    y2 = int(y - np.cos(theta) * 1000)
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

cv2.imshow("img", img)
cv2.waitKey(0)
